Interfaces

Two Implementations


같은 스택 인터페이스를 리스트의 뒤쪽과 앞쪽을 맨 위로 쓰는 두 클래스로 구현하고, 같은 호출 열을 함께 실행한다. 내부 리스트의 순서는 달라도 스택으로 관찰한 결과는 매 단계 같다.

공통 인터페이스두 구현 모두 push와 pop을 제공한다.
다른 내부 방향맨 위를 내부 리스트의 뒤쪽이나 앞쪽에 둘 수 있다.
같은 외부 관찰호출 뒤 상태와 반환값이 단계마다 같다.

두 구현에 같은 호출을 차례로 실행한다

호출 하나를 두 구현에 적용해도 단계마다 반환값과 외부 상태는 같다.

빈 스택에서 시작
스택으로 관찰한 상태 · 반환값

EndStack · 리스트 뒤쪽이 맨 위

FrontStack · 리스트 앞쪽이 맨 위

맨 위 칸은 클라이언트가 방금 실행한 호출, 초록 테두리 칸은 스택으로 관찰한 상태와 반환값이다. 아래 두 칸은 각 구현의 내부 리스트와 그 호출이 실행한 리스트 메서드다.

내부 리스트를 비교하면 순서가 다르지만, 스택으로 관찰한 맨 아래부터 맨 위까지의 순서와 pop 반환값은 같다. 클라이언트 코드 observe()는 두 구현 모두에서 ("dog", 4)를 얻는다.

같은 스택 연산을 서로 다른 리스트 메서드에 대응시킨다

구현의 차이는 경계 안의 메서드 대응이며 클라이언트 코드의 호출은 바뀌지 않는다.

스택 연산EndStack 내부FrontStack 내부외부 의미
push(item)append(item)insert(0, item)item을 새 맨 위 원소로 둔다
pop()pop()pop(0)맨 위 원소를 삭제해 반환한다

클라이언트 코드는 내부 list의 방향이 아니라 push와 pop의 결과에 의존한다. 내부 list 메서드를 직접 호출하면 구현을 바꿀 때 함께 고쳐야 한다.